home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2008 September
/
PCWorld_2008-09_cd.bin
/
domacnost a kancelar
/
joomla
/
Joomla_1.5.4-Stable-Full_Package.exe
/
plugins
/
xmlrpc
/
blogger.php
next >
Wrap
PHP Script
|
2008-07-06
|
19KB
|
569 lines
<?php
/**
* @version $Id: blogger.php 10381 2008-06-01 03:35:53Z pasamio $
* @package Joomla
* @copyright Copyright (C) 2005 - 2008 Open Source Matters. All rights reserved.
* @license GNU/GPL, see LICENSE.php
* Joomla! is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
* See COPYRIGHT.php for copyright notices and details.
*/
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
jimport( 'joomla.plugin.plugin' );
class plgXMLRPCBlogger extends JPlugin
{
function plgXMLRPCBlogger(&$subject, $config)
{
parent::__construct($subject, $config);
$this->loadLanguage( '', JPATH_ADMINISTRATOR );
}
/**
* @return array An array of associative arrays defining the available methods
*/
function onGetWebServices()
{
global $xmlrpcI4, $xmlrpcInt, $xmlrpcBoolean, $xmlrpcDouble, $xmlrpcString, $xmlrpcDateTime, $xmlrpcBase64, $xmlrpcArray, $xmlrpcStruct, $xmlrpcValue;
return array
(
'blogger.getUsersBlogs' => array(
'function' => 'plgXMLRPCBloggerServices::getUserBlogs',
'docstring' => JText::_('Returns a list of weblogs to which an author has posting privileges.'),
'signature' => array(array($xmlrpcArray, $xmlrpcString, $xmlrpcString, $xmlrpcString ))
),
'blogger.getUserInfo' => array(
'function' => 'plgXMLRPCBloggerServices::getUserInfo',
'docstring' => JText::_('Returns information about an author in the system.'),
'signature' => array(array($xmlrpcStruct, $xmlrpcString, $xmlrpcString, $xmlrpcString))
),
'blogger.getPost' => array(
'function' => 'plgXMLRPCBloggerServices::getPost',
'docstring' => JText::_('Returns information about a specific post.'),
'signature' => array(array($xmlrpcStruct, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString))
),
'blogger.getRecentPosts' => array(
'function' => 'plgXMLRPCBloggerServices::getRecentPosts',
'docstring' => JText::_('Returns a list of the most recent posts in the system.'),
'signature' => array(array($xmlrpcArray, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcInt))
),
'blogger.getTemplate' => array(
'function' => 'plgXMLRPCBloggerServices::getTemplate',
'docstring' => '',
'signature' => array(array($xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString))
),
'blogger.setTemplate' => array(
'function' => 'plgXMLRPCBloggerServices::setTemplate',
'docstring' => '',
'signature' => array(array($xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString))
),
'blogger.newPost' => array(
'function' => 'plgXMLRPCBloggerServices::newPost',
'docstring' => JText::_('Creates a new post, and optionally publishes it.'),
'signature' => array(array($xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcBoolean))
),
'blogger.deletePost' => array(
'function' => 'plgXMLRPCBloggerServices::deletePost',
'docstring' => JText::_('Deletes a post.'),
'signature' => array(array($xmlrpcBoolean, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcBoolean))
),
'blogger.editPost' => array(
'function' => 'plgXMLRPCBloggerServices::editPost',
'docstring' => JText::_('Updates the information about an existing post.'),
'signature' => array(array($xmlrpcBoolean, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcString, $xmlrpcBoolean))
)
);
}
}
class plgXMLRPCBloggerServices
{
/*
* Note : blogger.getUsersBlogs will make more sense once we support multiple blogs
*/
function getUserBlogs($appkey, $username, $password)
{
global $mainframe, $xmlrpcerruser, $xmlrpcI4, $xmlrpcInt, $xmlrpcBoolean, $xmlrpcDouble, $xmlrpcString, $xmlrpcDateTime, $xmlrpcBase64, $xmlrpcArray, $xmlrpcStruct, $xmlrpcValue;
if(!plgXMLRPCBloggerHelper::authenticateUser($username, $password)) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_("Login Failed"));
}
$user =& JFactory::getUser($username);
plgXMLRPCBloggerHelper::getUserAid( $user );
// Handle the access permissions part of the main database query
if ($user->authorize('com_content', 'edit', 'content', 'all')) {
$xwhere = '';
} else {
$xwhere = ' AND a.published = 1 AND b.published = 1';
}
$gid = $user->get('aid', 0);
$access_check = ' AND a.access <= '.(int) $gid .
' AND b.access <= '.(int) $gid;
// Query of categories within section
$query = 'SELECT a.id, a.title, a.section, ' .
' CONCAT_WS(\'/\', a.title, b.title) AS catName' .
' FROM #__categories AS a' .
' LEFT JOIN #__sections AS b ON a.section = b.id' .
$xwhere.
$access_check;
$db = &JFactory::getDBO();
$db->setQuery( $query );
$categories = $db->loadObjectList();
$structarray = array();
foreach( $categories AS $category ) {
if (intval($category->section) > 0) {
$blog = new xmlrpcval(array(
'url' => new xmlrpcval(JURI::base(), $xmlrpcString),
'blogid' => new xmlrpcval($category->id, $xmlrpcString),
'blogName' => new xmlrpcval($category->catName, $xmlrpcString)
), 'struct');
array_push($structarray, $blog);
}
}
return new xmlrpcresp(new xmlrpcval( $structarray , $xmlrpcArray));
}
function getUserInfo($appkey, $username, $password)
{
global $xmlrpcerruser, $xmlrpcStruct;
if(!plgXMLRPCBloggerHelper::authenticateUser($username, $password)) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_("Login Failed"));
}
$user =& JFactory::getUser($username);
plgXMLRPCBloggerHelper::getUserAid( $user );
$struct = new xmlrpcval(
array(
'nickname' => new xmlrpcval($user->get('username')),
'userid' => new xmlrpcval($user->get('id')),
'url' => new xmlrpcval(''),
'email' => new xmlrpcval($user->get('email')),
'lastname' => new xmlrpcval($user->get('name')),
'firstname' => new xmlrpcval($user->get('name'))
), $xmlrpcStruct);
return new xmlrpcresp($struct);
}
function getPost($appkey, $postid, $username, $password)
{
global $xmlrpcerruser, $xmlrpcI4, $xmlrpcInt, $xmlrpcBoolean, $xmlrpcDouble, $xmlrpcString, $xmlrpcDateTime, $xmlrpcBase64, $xmlrpcArray, $xmlrpcStruct, $xmlrpcValue;
if(!plgXMLRPCBloggerHelper::authenticateUser($username, $password)) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_("Login Failed"));
}
$user =& JFactory::getUser($username);
plgXMLRPCBloggerHelper::getUserAid( $user );
$db = &JFactory::getDBO();
$where = 'a.id = ' . (int) $postid;
$canReadUnpublished = $user->authorize('com_content', 'edit', 'content', 'all');
if ($canReadUnpublished) {
$publishedWhere = '';
} else {
$publishedWhere = ' AND u.published = 1 AND b.published = 1';
}
$nullDate = $db->getNullDate();
$date =& JFactory::getDate();
$now = $date->toMySQL();
$query = 'SELECT a.title AS title,'
. ' a.created AS created,'
. ' a.introtext AS introtext,'
. ' a.fulltext AS ftext,'
. ' a.id AS id,'
. ' a.created_by AS created_by'
. ' FROM #__content AS a'
. ' INNER JOIN #__categories AS b ON b.id=a.catid'
. ' INNER JOIN #__sections AS u ON u.id = a.sectionid'
. ' WHERE '.$where
. $publishedWhere
. ' AND a.access <= '.(int) $user->get( 'aid' )
. ' AND b.access <= '.(int) $user->get( 'aid' )
. ' AND u.access <= '.(int) $user->get( 'aid' )
. ' AND ( a.publish_up = '.$db->Quote($nullDate).' OR a.publish_up <= '.$db->Quote($now).' )'
. ' AND ( a.publish_down = '.$db->Quote($nullDate).' OR a.publish_down >= '.$db->Quote($now).' )'
;
$db->setQuery( $query );
$item = $db->loadObject();
if ($item === null) {
return new xmlrpcresp(0, $xmlrpcerruser+2, JText::_("Access Denied"));
}
$content = '<title>'.$item->title.'</title>';
$content .= $item->introtext.'<more_text>'.$item->ftext.'</more_text>';
$struct = new xmlrpcval(
array(
'userid' => new xmlrpcval($item->created_by),
'dateCreated' => new xmlrpcval($item->created),
'content' => new xmlrpcval($content),
'postid' => new xmlrpcval($item->id)
), $xmlrpcStruct);
return new xmlrpcresp($struct);
}
function newPost($appkey, $blogid, $username, $password, $content, $publish)
{
global $xmlrpcerruser, $xmlrpcI4, $xmlrpcInt, $xmlrpcBoolean, $xmlrpcDouble, $xmlrpcString, $xmlrpcDateTime, $xmlrpcBase64, $xmlrpcArray, $xmlrpcStruct, $xmlrpcValue;
if(!plgXMLRPCBloggerHelper::authenticateUser($username, $password)) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_("Login Failed"));
}
$user =& JFactory::getUser($username);
plgXMLRPCBloggerHelper::getUserAid( $user );
if ($user->get('gid') < 19) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('ALERTNOTAUTH'));
}
// Create a user access object for the user
$access = new stdClass();
$access->canEdit = $user->authorize('com_content', 'edit', 'content', 'all');
$access->canEditOwn = $user->authorize('com_content', 'edit', 'content', 'own');
$access->canPublish = $user->authorize('com_content', 'publish', 'content', 'all');
if (!($access->canEdit || $access->canEditOwn)) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('ALERTNOTAUTH'));
}
$db =& JFactory::getDBO();
// load plugin params info
$plugin =& JPluginHelper::getPlugin('xmlrpc','blogger');
$params = new JParameter( $plugin->params );
$blogid = (int) $blogid;
// load the category
$cat =& JTable::getInstance('category');
$cat->load($blogid);
// create a new content item
$item =& JTable::getInstance('content');
$item->title = plgXMLRPCBloggerHelper::getPostTitle($content);
$item->introtext = plgXMLRPCBloggerHelper::getPostIntroText($content);
$item->fulltext = plgXMLRPCBloggerHelper::getPostFullText($content);
$item->catid = $blogid;
$item->sectionid = $cat->section;
$date =& JFactory::getDate();
$item->created = $date->toMySQL();
$item->created_by = $user->get('id');
$item->publish_up = $date->toMySQL();
$item->publish_down = $db->getNullDate();
$item->state = ($publish && $access->canPublish) ? 1 : 0;
if (!$item->check()) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Post check failed') );
}
$item->version++;
if (!$item->store()) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Post store failed') );
}
return new xmlrpcresp(new xmlrpcval($item->id, $xmlrpcString));
}
function editPost($appkey, $postid, $username, $password, $content, $publish)
{
global $xmlrpcerruser, $xmlrpcI4, $xmlrpcInt, $xmlrpcBoolean, $xmlrpcDouble, $xmlrpcString, $xmlrpcDateTime, $xmlrpcBase64, $xmlrpcArray, $xmlrpcStruct, $xmlrpcValue;
if(!plgXMLRPCBloggerHelper::authenticateUser($username, $password)) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_("Login Failed"));
}
$user =& JFactory::getUser($username);
plgXMLRPCBloggerHelper::getUserAid( $user );
// Create a user access object for the user
$access = new stdClass();
$access->canEdit = $user->authorize('com_content', 'edit', 'content', 'all');
$access->canEditOwn = $user->authorize('com_content', 'edit', 'content', 'own');
$access->canPublish = $user->authorize('com_content', 'publish', 'content', 'all');
if (!($access->canEdit || $access->canEditOwn)) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('ALERTNOTAUTH'));
}
// load the row from the db table
$item =& JTable::getInstance('content');
if(!$item->load( $postid )) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Sorry, no such post') );
}
if($item->isCheckedOut($user->get('id'))) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Sorry, post is already being edited') );
}
//lock the item
$item->checkout($user->id);
$item->title = plgXMLRPCBloggerHelper::getPostTitle($content);
$item->introtext = plgXMLRPCBloggerHelper::getPostIntroText($content);
$item->fulltext = plgXMLRPCBloggerHelper::getPostFullText($content);
if (!$item->check()) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Post check failed') );
}
$item->version++;
if (!$item->store()) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Post store failed') );
}
$item->state = ($publish && $access->canPublish) ? 1 : 0;
//lock the item
$item->checkout();
return new xmlrpcresp(new xmlrpcval('true', $xmlrpcBoolean));
}
function deletePost($appkey, $postid, $username, $password, $publish)
{
global $xmlrpcerruser, $xmlrpcI4, $xmlrpcInt, $xmlrpcBoolean, $xmlrpcDouble, $xmlrpcString, $xmlrpcDateTime, $xmlrpcBase64, $xmlrpcArray, $xmlrpcStruct, $xmlrpcValue;
if(!plgXMLRPCBloggerHelper::authenticateUser($username, $password)) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_("Login Failed"));
}
$user =& JFactory::getUser($username);
plgXMLRPCBloggerHelper::getUserAid( $user );
if ($user->get('gid') < 23) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('ALERTNOTAUTH'));
}
// load the row from the db table
$item =& JTable::getInstance('content');
if(!$item->load( $postid )) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Sorry, no such post') );
}
if($item->isCheckedOut($user->get('id'))) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Sorry, post is already being edited') );
}
//lock the item
$item->checkout();
$item->state = -2;
$item->ordering = 0;
if (!$item->store()) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Post delete failed') );
}
return new xmlrpcresp(new xmlrpcval('true', $xmlrpcBoolean));
}
/**
* Blogger API - blogger.getRecentPosts
*
* @param xmlrpcmessage XML-RPC message passed to the method
* @return xmlrpcresp XML-RPC response
*/
function getRecentPosts($appkey, $blogid, $username, $password, $numposts)
{
global $xmlrpcerruser, $xmlrpcI4, $xmlrpcInt, $xmlrpcBoolean, $xmlrpcDouble, $xmlrpcString, $xmlrpcDateTime, $xmlrpcBase64, $xmlrpcArray, $xmlrpcStruct, $xmlrpcValue;
if(!plgXMLRPCBloggerHelper::authenticateUser($username, $password)) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_("Login Failed"));
}
$user =& JFactory::getUser($username);
plgXMLRPCBloggerHelper::getUserAid( $user );
// load plugin params info
$plugin =& JPluginHelper::getPlugin('xmlrpc','blogger');
$params = new JParameter( $plugin->params );
$db =& JFactory::getDBO();
$nullDate = $db->getNullDate();
$date =& JFactory::getDate();
$now = $date->toMySQL();
$blogid = (int) $blogid;
$canReadUnpublished = $user->authorize('com_content', 'edit', 'content', 'all');
if ($canReadUnpublished) {
$publishedWhere = '';
$publishTimeWhere = '';
} else {
$publishedWhere = ' AND u.published = 1 AND b.published = 1';
$publishTimeWhere = ' AND ( a.publish_up = '.$db->Quote($nullDate).' OR a.publish_up <= '.$db->Quote($now).' )'
. ' AND ( a.publish_down = '.$db->Quote($nullDate).' OR a.publish_down >= '.$db->Quote($now).' )';
}
$query = 'SELECT a.title AS title,'
. ' a.created AS created,'
. ' a.introtext AS introtext,'
. ' a.fulltext AS ftext,'
. ' a.id AS id,'
. ' a.created_by AS created_by'
. ' FROM #__content AS a'
. ' INNER JOIN #__categories AS b ON b.id=a.catid'
. ' INNER JOIN #__sections AS u ON u.id = a.sectionid'
. ' WHERE a.catid = '. $blogid
. $publishedWhere
. ' AND a.access <= '.(int) $user->get( 'aid' )
. ' AND b.access <= '.(int) $user->get( 'aid' )
. ' AND u.access <= '.(int) $user->get( 'aid' )
. $publishTimeWhere
;
$db->setQuery($query, 0, $numposts);
$items = $db->loadObjectList();
if ($items === null) {
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('No posts available, or an error has occured.') );
}
$structArray = array();
foreach ($items as $item)
{
$content = '<title>'.$item->title.'</title>';
$content .= $item->introtext.'<more_text>'.$item->ftext.'</more_text>';
$structArray[] = new xmlrpcval(array(
'userid' => new xmlrpcval($item->created_by),
'dateCreated' => new xmlrpcval($item->created),
'content' => new xmlrpcval($content),
'postid' => new xmlrpcval($item->id)
), 'struct');
}
return new xmlrpcresp(new xmlrpcval( $structArray , $xmlrpcArray));
}
function getTemplate($appkey, $blogid, $username, $password, $templateType)
{
global $xmlrpcerruser;
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Method not implemented') );
}
function setTemplate($appkey, $blogid, $username, $password, $template, $templateType)
{
global $xmlrpcerruser;
return new xmlrpcresp(0, $xmlrpcerruser+1, JText::_('Method not implemented') );
}
}
class plgXMLRPCBloggerHelper
{
function getUserAid( &$user ) {
$acl = &JFactory::getACL();
//Get the user group from the ACL
$grp = $acl->getAroGroup($user->get('id'));
// Mark the user as logged in
$user->set('guest', 0);
$user->set('aid', 1);
// Fudge Authors, Editors, Publishers and Super Administrators into the special access group
if ($acl->is_group_child_of($grp->name, 'Registered') ||
$acl->is_group_child_of($grp->name, 'Public Backend')) {
$user->set('aid', 2);
}
}
function authenticateUser($username, $password)
{
// Get the global JAuthentication object
jimport( 'joomla.user.authentication');
$auth = & JAuthentication::getInstance();
$credentials = array( 'username' => $username, 'password' => $password );
$options = array();
$response = $auth->authenticate($credentials, $options);
return $response->status === JAUTHENTICATE_STATUS_SUCCESS;
}
function getPostTitle($content)
{
$title = '';
if ( preg_match('/<title>(.+?)<\/title>/is', $content, $matchtitle) )
{
$title = $matchtitle[0];
$title = preg_replace('/<title>/si', '', $title);
$title = preg_replace('/<\/title>/si', '', $title);
}
if (empty( $title )) {
$title = substr( $content, 0, 20 );
}
return $title;
}
function getPostCategory($content)
{
$category = 0;
$match = array();
if ( preg_match('/<category>(.+?)<\/category>/is', $content, $match) )
{
$category = trim($match[1], ',');
$category = explode(',', $category);
}
return $category;
}
function getPostIntroText($content)
{
return plgXMLRPCBloggerHelper::removePostData($content); //substr($string, 0, strpos($string, '<more_text>'));
}
function getPostFullText($content)
{
$match = array();
if ( preg_match('/<more_text>(.+?)<\/more_text>/is', $content, $match) )
{
$fulltext = $match[0];
$fulltext = preg_replace('/<more_text>/si', '', $fulltext);
$fulltext = preg_replace('/<\/more_text>/si', '', $fulltext);
}
return $fulltext;
}
function removePostData($content)
{
$content = preg_replace('/<title>(.+?)<\/title>/si', '', $content);
$content = preg_replace('/<category>(.+?)<\/category>/si', '', $content);
$content = preg_replace('/<more_text>(.+?)<\/more_text>/si', '', $content);
$content = trim($content);
return $content;
}
}